# -*- coding: utf-8 -*-
# בש״ד
#
# Miraflores Blog for Django - Part of the Cuba Libre Project
# Copyright (C) 2009, Joshua "jag" Ginsberg <jag@flowtheory.net>
# 
# Por mi amor, que inspira a mi cada respiración y que echa de Cuba
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

try:
    import feedparser
except ImportError:
    feedparser = ''
import sys
import traceback
from django.core.cache import cache
from miraflores.blogroll.models import RelatedBlogFeed

def update_feed(related_blog, errors_to='stderr'):
    try:
        feed = feedparser.parse(related_blog.feed_url)
    except Exception, e:
        for line in traceback.format_exception_only(type(e), e):
            sys.getattr(errors_to).write(line)
    else:
        cache.set(get_cache_key(related_blog),
                  feed,
                  3600)
        return feed
        
def get_cache_key(related_blog):
    return 'miraflores:blogroll:%d' % related_blog.id 

def get_blogroll():
    if not feedparser:
        return []
    related_blogs = RelatedBlogFeed.objects.all()
    feeds = []
    for related_blog in related_blogs:
        feed = cache.get(get_cache_key(related_blog))
        if not feed:
            # This is kinda bad. It will result in crappy service for the user.
            # Really cron should be handling this or you should be using a
            # caching engine that spans processes.
            feed = update_feed(related_blog)
        feeds.append(feed)
    return feeds

            